#include "AopernCV.h"
#include <iostream>
#include <opencv/cv.h>
#include <opencv/cxcore.h>
#include <opencv/highgui.h>

using namespace std;

void info(IplImage* o);

void AopenCV::przetwarzanie(Skan3D* skan3d) {
    const char* okno = "Okno";

    IplImage* obraz = cvCreateImage(cvSize(200, 200), IPL_DEPTH_8U, 3);
    cvNamedWindow(okno, 0);
    cvShowImage(okno, obraz);
}

void AopenCV::przetwarzanie(const char* plik) {
    /*
    cout << "AopenCV::przetwarzanie(" << plik << ")" << endl;
    //wczytujemy z pliku obraz
    //IplImage* obraz = cvLoadImage(plik);
    //IplImage* obrazCzB = cvCreateImage(cvGetSize(obraz), IPL_DEPTH_8U, 1);
    //konwertujemy na czarnobiały
    //cvCvtColor(obraz, obrazCzB, CV_BGR2GRAY);
    //cvSaveImage("/home/arkadiusz/Pulpit/aopenCV_CzB.png", obrazCzB);
    cout << "                             zapiano: aopenCV_CzB.png" << endl;
    //tu gdzie będą krawędzie
    //IplImage* kraw = cvCreateImage(cvGetSize(obraz), obraz->depth , 0);
    //IplImage* kraw = cvCloneImage(obrazCzB);

    ////////////////////// Canny
    //wyciągamy krawędzie algorytmem canny
    cout << "info o obrazie do Canny:" << endl;
    cout << "depth:" << obrazCzB->depth << endl;
    cout << "colorModel:" << obrazCzB->colorModel << endl;

    cvCanny(obrazCzB, kraw, 0.1, 2.2, 5);
    //cvSaveImage("/home/arkadiusz/Pulpit/aopenCV_Kraw.png", kraw);
    cout << "                             wykonano: cvCanny" << endl;


    //////////////////////
    
     IplImage* obrazPyrD = cvCloneImage(obraz);
    cvPyrDown(obraz, obrazPyrD, IPL_GAUSSIAN_5x5);
    cvSaveImage("/home/arkadiusz/Pulpit/aopenCV_PyrD.png", obrazPyrD);
     */
    ////////////////////// Hough
    cout << "1" << endl;
  //  float* linie;
    cout << "2" << endl;
 //   int maxLinii = 40;
    cout << "3" << endl;
    //IplImage* krawH = cvCloneImage(kraw);
    cout << "4" << endl;
    //cvHoughLines(kraw, 5.0, 5.0, 2, linie, maxLinii);
    cout << "5" << endl;
    cout << "                             wykonano: cvHoughLines" << endl << endl << endl;
    cout << "6" << endl;
    //cout<<sizeof(linie);
    //cout<<maxLinii;

    //cout<<endl;
    /*
    for (int i = 0; i < maxLinii; i++) {
        cout << i << " ro=" << linie[2 * i] << " teta=" << linie[2 * i + 1] << endl;
    }*/

    /*
    cvLineAA(src, cvPoint(cvRound(cos(lines[2 * i + 1]) / lines
            [2 * i]), 0), cvPoint(0, cvRound(sin(lines[2 * i + 1]) / lines[2 * i])), CV_RGB
            (0, 23, 25));
     */
    //cout << "xxxx" << endl;
    //cvSaveImage("/home/arkadiusz/Pulpit/aopenCV.png", obraz);
    //cout << "xxxx" << endl;
   // cvSaveImage("/home/arkadiusz/Pulpit/CV_krawedzie.png", kraw);


}

void AopenCV::przetwarzanie(const char* plikR, const char* plikG, const char* plikB) {
    //wczytujemy obrazki
    char* tabObr[3] = {(char*)plikR, (char*)plikG, (char*)plikB};
    for(int nr = 0; nr < 3; nr++){

    IplImage* oR = cvLoadImage(tabObr[nr]);
    IplImage* oR_Gray = cvCreateImage(cvGetSize(oR), IPL_DEPTH_8U, 1);
    cvCvtColor(oR, oR_Gray, CV_BGR2GRAY);

    IplImage* oR8U = cvCreateImage(cvGetSize(oR_Gray), IPL_DEPTH_8U, 1);
 //   IplImage* oR32F = cvCreateImage(cvGetSize(oR_Gray), IPL_DEPTH_32F, 1);
 //   IplImage* oR32F_k = cvCloneImage(oR32F);
    cout<<"info oR32F:"<<endl;
 
    info(oR_Gray);
    info(oR8U);
    cvSmooth(oR_Gray,oR8U,CV_MEDIAN);
//    cvSmooth(oR_Gray,oR8U);
    cvThreshold( oR8U, oR_Gray, 64, 255 ,CV_THRESH_TOZERO);//CV_THRESH_TOZEROwszystko ponizej progu to zero reszta bez zmian
    cvCanny(oR_Gray, oR8U, 64, 255, 3);

    string nazwa;
    nazwa+="/home/arkadiusz/Dokumenty/IPPT/GrantI/";
    nazwa+=48+nr;
    nazwa+="_CV_Wynik_R.png";
    cout<<nazwa;
   // cvConvertScale( oR32F, oR8U);
    cvSaveImage(nazwa.c_str(),oR8U );
        
    IplImage* color_dst = cvCreateImage( cvGetSize(oR), 8, 3 );

    CvMemStorage* storage = cvCreateMemStorage(0);
    CvSeq* lines = 0;
    cvCvtColor(oR8U, color_dst, CV_GRAY2BGR);

    lines = cvHoughLines2(
            oR8U,/*obraz*/
            storage, /*miejsce na dane*/
            CV_HOUGH_PROBABILISTIC, /*typ obliczen*/
            1, CV_PI / 360,/*rozdzielczosc ro=px; teta=stopnie*/
            10, /*prog*/
            10, /*dla losowej minimalna dlugosc lini*/
            1/*odlegleglosc punktow ktore mozna laczyc*/
            );
    for (int i = 0; i < lines->total; i++) {
        CvPoint* line = (CvPoint*) cvGetSeqElem(lines, i);
        cvLine(color_dst, line[0], line[1], CV_RGB(255, 0, 0));
    }

   cvSaveImage("/home/arkadiusz/Dokumenty/IPPT/GrantI/CV_wykryteKrawedzie.png", color_dst);
    }

    //- - - - - - - - - - - - - - - - -

}

void przetwarzanie(IplImage* iplObraz) {


}

void info(IplImage* o){
    cout<<"ID:         "<<o->ID<<endl;
    cout<<"depth:      "<<o->depth<<endl;
    cout<<"nChannels:  "<<o->nChannels<<endl;
    cout<<"channelSeq: "<<o->channelSeq<<endl;
    cout<<"colorModel: "<<o->colorModel<<endl;
    cout<<"borderMode: "<<o->BorderMode<<endl;
    cout<<endl;
}
